/**
*
*
*\author Isabel Martín Herrero 48539974 S
*
*
**/
#include <exception>
#include "ExcepcionSVG.h"
#include <iostream>
using namespace std;


//#include <cfloat>
//#include <sstream>

/**
*\file Coordenada.h
*\brief Archivo .h de la clase Coordenada
*Archivo que contiene la declaración de la clase Coordenada
*
**/

#ifndef _CAMALEON_H_
#define _CAMALEON_H_


/** \brief Clase Coordeanda
 *
 * La clase Coordenada permite crear, destruir y modificar objetos de tipo Coordenada.Un objeto Coordenada tiene los atributos privados "x" e "y"
 * La clase Coordenada es amiga de ostream e istream
 */

class Coordenada
{
	/** \brief Sobrecarga del operador de salida de Coordenada.
	*
	* Función amiga. Devuelve un objeto ostream con el valor de la coordenada
	* \param is Objeto de tipo ostream
	* \param c Objeto de tipo coordenada &
	* \return Devuelve un objeto de tipo ostream
	*/
	friend istream& operator>>(istream& is,Coordenada& c);
	
	/** \brief Sobrecarga del operador de entrada de Coordenada.
	*
	* Función amiga. Lee los valores de una coordenada desde is y la guarda en c. Valida los valores leidos. Si el valor no es válido, se le asigna ERR_VALOR
	* \param os objeto de tipo istream
	* \param c objeto de tipo Coordenada que guardará el valor leido
	* \return Devuelve un objeto de tipo istream&, is.
	*/
    friend ostream& operator<<(ostream& os,const Coordenada& c);
	
	public:
		
		/** \brief Constructor de Coordenada.
		*
		* Crea un objeto de tipo Coordenada, con los valores x e y. Si no son válidos,  se inicializan a 0.0 y 0.0
		*/
		Coordenada(float = 0.0, float = 0.0);
		
		/** \brief Constructor de Copia de Coordenada
		*
		* Crea un objeto de tipo Coordenada, copia del que se le pasa como parámetro.
		* \param nc Coordenada de la que tomará los valores la que hay que crear
		*/
		Coordenada(const Coordenada& nc);
		
		/** \brief Destructor de Coordeanda.
		*
		* Libera la memoria que ocupa un objeto de tipo Coordenada.
		*/
		~Coordenada();
		
		/** \brief Operador asignación de Coordenada.
		*
		* Asigna al objeto invocador el valor de los atributos del que se pasa como parámetro
		* \param c Objeto Coordenada que dará los valores para el invocador
		* \return Devuelve el objeto Coordenada invocador modificado
		*/
		Coordenada& operator=(const Coordenada& c);
		//void setX(float nx){ x=nx;};
		//void setY(float ny){ y=ny;};
		
		/** \brief Método getX
		*
		*  Devuelve el valor de la parte x de la coordenada
		* \return  Devuelve un float, que es el valor de la parte x de la coordenada .
		*/
		float getX() const {return x;};
		
		/** \brief Método getY
		*
		* Devuelve el valor de la parte y de la coordenada.
		* \return Devuelve un float, que es el valor de la parte y de la coordenada .
		*/
		float getY() const {return y;};
		
		/** \brief Método Imprimir.
		*
		* Devuelve un objeto ostream con el valor de la coordenada
		* \param os Toma como parámetro un objeto de tipo flujo de salida
		* \return Devuelve un objeto de tipo flujo de salida (ostream) con el valor de la coordenada
		*/
		void imprimir(ostream& os) const;

		/** \brief Operador comparación de Coordenada.
		*
		* Función amiga. Sobrecarga del operador de igualdad entre Coordenadas
		* \param nc Coordenada con la que se comparará a la que invoca al método
		* \return Devuelve True si las coordenadas que se comparan son iguales, y False en caso contrario 
		*/
		bool operator==(const Coordenada& nc) const;
		
		/** \brief Sobrecarga del operador de suma de Coordenada.
		*
		* Devuelve una coordenada resultado de la suma de otras dos. Si el resultado no es válido, devuelve coordenadaError
		* \param nc Coordenada que se va a sumar
		* \return Devuelve una coordenada suma de otras dos.
		*/
		Coordenada operator+(const Coordenada& nc) const;
		
		/** \brief Sobrecarga del operador resta de Coordenada.
		*
		* Devuelve una coordenada resultado de la resta de otras dos. Si el resultado no es válido, deuvleve coordenadaError
		* \param nc Coordenada que se va a restar. 
		* \return Devuelve una coordenada resta de otras dos.
		*/
		Coordenada operator-(const Coordenada& nc) const;
		 
		/** \brief Sobrecarga del operador producto de Coordenada.
		*
		* Devuelve una coordenada resultado del producto de otras dos. Si el resultado no es válido, devuelve lanza una excepcion
		* \param nc Coordenada que se va a restar. 
		* \return Devuelve una coordenada multiplo de otras dos.
		*/
		Coordenada operator*(float nc) const;
	private:
		/** \brief Miembro X.
		*
		* Float que contiene el valor de la parte x de la coordenada
		*/
		float x;
		
		/** \brief Miembro Y.
		*
		* Float que contiene el valor de la parte y de la coordenada
		*/
		float y;
		

};

#endif
